#include "event/timer_event.hpp"

#include "event/loop.hpp"

using namespace ibox::event;

bool TimerEvent::enable() {
    if (is_enabled()) {
        return true;
    }

    // NOTE: 不能在这里make_unique后就不管了,
    // 不然Timer对象在这个方法结束后就析构了, 会导致后面访问出现异常
    auto timer = std::make_unique<Timer>(
        m_interval.count(),
        m_mode == Mode::Oneshot ? 1 : std::numeric_limits<uint64_t>::max(),
        [this] { on_event(); });
    m_token = m_loop->add_timer(std::move(timer));
    m_is_enabled = true;
    return true;
}

bool TimerEvent::disable() {
    // 需要把它从timer_min_heap中移除
    if (m_loop) {
        m_loop->del_timer(m_token);
    }

    if (!is_enabled()) {
        return true;
    }

    m_is_enabled = false;
    return true;
}

// TimerEvent的回调函数
void TimerEvent::on_event() {
    if (m_mode == Mode::Oneshot) {
        m_is_enabled = false;
        // 怎样删除cabinet中的obj指针?
        // m_loop->m_timer_cabinet.at(...) 不删除倒也不影响
        m_token->reset();
    }

    m_loop->before_handle_one_event();
    if (m_cb) {
        m_cb();
    }
    m_loop->after_handle_one_event();
}
